package com.easyticket.common.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Criterion;

import com.easyticket.system.pojo.User;

/**
 * *
 * @param <T>
 *            泛型，指实体类 type
 * @param <PK>
 *            泛型，指实体类主键的数据类型，如Integer,Long
 */
public interface EntityDao<T, PK extends Serializable> {

    /****************************************find method *******************************************/
    /**
     * 按id获取对象.
     */
    public T load(final Class<T> entityClass, final PK id);

    /**
     * 取得对象的主键名.
     */
    public String getIdName(final Class<T> entityClass);
	
    /**
     * 按Criteria查询对象列表.
     * 
     * @param criterions 数量可变的Criterion.
     */
    public List<T> find(final Criterion... criterions);

    /**
     *  获取全部对象.
     */
    public List<T> getAll();

    /**
     * 按属性查找对象列表,匹配方式为相等.
     */
    public List<T> findBy(final String propertyName, final Object value);

    /**
     * 按属性查找唯一对象,匹配方式为相等.
     */
    public T findByUnique(final String propertyName, final Object value);

    /**
     * 按HQL查询对象列表.
     * 
     * @param values 数量可变的参数,按顺序绑定.
     */
    public List<T> find(final String hql, final Object... values);

    /**
     * 按HQL查询对象列表.
     * 
     * @param values 命名参数,按名称绑定.
     */
    public List<T> find(final String hql, final Map<String, Object> values);

    /**
     * 按HQL查询唯一对象.
     * 
     * @param values 数量可变的参数,按顺序绑定.
     */
    public T findUnique(final String hql, final Object... values);

    /**
     * 按HQL查询唯一对象.
     * 
     * @param values 命名参数,按名称绑定.
     */
    public T findUnique(final String hql, final Map<String, Object> values);

    /**
     * 按HQL查询Integer类型结果.
     */
    public Integer findInt(final String hql, final Object... values);

    public Integer findInt(final String hql, final Map<String, Object> values);

    /**
     * 按HQL查询Long类型结果.
     */
    public Long findLong(final String hql, final Object... values);

    /**
     * 按HQL查询Long类型结果.
     */
    public Long findLong(final String hql, final Map<String, Object> values);

    /**
     * 根据查询HQL与参数列表创建Query对象.
     * 
     * 本类封装的find()函数全部默认返回对象类型为T,当不为T时使用本函数.
     * 
     * @param values 数量可变的参数,按顺序绑定.
     */
    public Query createQuery(final String queryString, final Object... values);

    /**
     * 根据查询HQL与参数列表创建Query对象.
     * 
     * @param values 命名参数,按名称绑定.
     */
    public Query createQuery(final String queryString,
            final Map<String, Object> values);

    /**
     * 根据Criterion条件创建Criteria.
     * 
     * 本类封装的find()函数全部默认返回对象类型为T,当不为T时使用本函数.
     * 
     * @param criterions 数量可变的Criterion.
    */
    public Criteria createCriteria(final Criterion... criterions);
	
    /**
     * 按Criteria查询唯一对象.
     * 
     * @param criterions 数量可变的Criterion.
     */
    public T findUnique(final Criterion... criterions);

    /***************************************save method ********************************************/
    /**
     * 保存新增或修改的对象.
     */
    public void save(T entity);

    /***************************************save method end****************************************/

    /***************************************delete method ********************************************/
    /**
     * 删除对象.
     * 
     * @param entity 对象必须是session中的对象或含id属性的transient对象.
     */
    public void delete(final T entity);
	
    
    /**
     * 按id删除对象.
    
    public void delete(final PK id);
	 */
    /***************************************delete method end*****************************************/

    public void update(final T entity);
    
    public void update(final Class<T> entity, final PK id);
    
    /**
     * 执行HQL进行批量修改/删除操作.
     */
    public int batchExecute(final String hql, final Object... values);

    /**
     * 执行HQL进行批量修改/删除操作.
     */
    public int batchExecute(final String hql, final Map<String, Object> values);
    
}
